
/*
*  File name: Utils.h
*  Describe: 实现一些通用的函数
*  Created on: 2015-2-12
*      Author: dengxiudong
*/

#ifndef _UTILS_H_
#define _UTILS_H_

#include <stdint.h>
#include <string>
#include <vector>
#include <sstream>


using namespace std;

namespace loong
{
	//转换64字节序
#define swap64BtyeOrder(val) (((val) >> 56) | \
(((val)& 0x00ff000000000000) >> 40) | \
(((val)& 0x0000ff0000000000) >> 24) | \
(((val)& 0x000000ff00000000) >> 8) | \
(((val)& 0x00000000ff000000) << 8) | \
(((val)& 0x0000000000ff0000) << 24) | \
(((val)& 0x000000000000ff00) << 40) | \
(((val) << 56)));

//***************************************************************************
// 函数名称:
// 函数说明：获取日期时间，并且精确到毫秒
// 作    者：dengxiudong
// 日    期：$DATE$
// 返 回 值: 无
// 参    数:
//***************************************************************************
	int getMsecTime(char *strTm);

	//***************************************************************************
	// 函数名称:
	// 函数说明：获取当前的日期时间，格式：2015-3-6 10：10：10
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	void getCurrDateTime(char *datetime);

	//***************************************************************************
	// 函数名称:
	// 函数说明：获取当前的日期时间，格式：20150306
	// 作    者：dengxiudong
	// 日    期：2015-8-28
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	void getCurrDate(char *currDate);

	//***************************************************************************
	// 函数名称:
	// 函数说明：将日期时间格式的字符串转换为时间戳
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	long datetimeToTimestamp(const char *datetime);

	//***************************************************************************
	// 函数名称:
	// 函数说明：64位网络字节序转换-网络转本机字节序
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	uint64_t ntohll(uint64_t val);

	//***************************************************************************
	// 函数名称:
	// 函数说明：64位网络字节序转换-本机转网络字节序
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	uint64_t htonll(uint64_t val);

	//***************************************************************************
	// 函数名称:
	// 函数说明：移动文件
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	int movefile(const char *src_path, char *dst_path);

	//***************************************************************************
	// 函数名称:
	// 函数说明：创建目录
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	int createdir(const char *path);
	//***************************************************************************
	// 函数名称:
	// 函数说明：去掉字符串指定的前后字符
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	char *strtrim(char* str, const char* delim, int trimtype);

	//***************************************************************************
	// 函数名称:
	// 函数说明：解析http请求字符串//aaa=bbb&ccc=ddd&eee=fff
	// 作    者：dengxiudong
	// 日    期：$DATE$
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	int parsePairsString(char *src, const char *split_sec,
		const char *split_key, const char *trim_str, char **args, int *pcount);

	//***************************************************************************
	// 函数名称:
	// 函数说明：将整形或浮点型转为字符串类型
	// 作    者：dengxiudong
	// 日    期：2015-7-26
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	template<class T>
	string toString(T value)
	{
		ostringstream ss;
		ss << value;
		return ss.str();
	}

	//***************************************************************************
	// 函数名称:
	// 函数说明：解析逗号分隔的字符串
	// 作    者：dengxiudong
	// 日    期：2015-7-26
	// 返 回 值: 无
	// 参    数:
	//***************************************************************************
	vector<string> parseDotString(string inp, string dot = ",");

	//***************************************************************************
	// 函数名称:
	// 函数说明：字符编码转换
	// 作    者：dengxiudong
	// 日    期：2015-8-25
	// 返 回 值: 无
	// 参    数: from:要转换的字符编码类型；to：目标字符编码类型
	//			 src：要转换的字符串；dst：转换编码后的目标字符串
	//***************************************************************************
	void codeConvert(char * from, char * to, char * src, char * dst, size_t dstSize);

	//***************************************************************************
	// 函数名称:
	// 函数说明：解析逗号分隔的字符串
	// 作    者：dengxiudong
	// 日    期：2015-8-25
	// 返 回 值: 无
	// 参    数: 将gbk的字符编码的字符串转换为utf8的字符编码
	//***************************************************************************
	void gbk2utf8(char * src, char * dst, size_t dstSize);

	//***************************************************************************
	// 函数名称:
	// 函数说明：判断是否是合法的ip地址
	// 作    者：dengxiudong
	// 日    期：2015-9-15
	// 返 回 值: 无
	// 参    数: ip地址字符串
	//***************************************************************************
	bool isIp(const char *ipstr);

    //***************************************************************************
    // 函数名称:
    // 函数说明：这个函数是将字符串MD5加密后转换为字符串的，需要头文件openssl/md5.h
    // 					 在安装有openssl的机器上可以使用这个函数，放开注释就行
    // 作    者：dengxiudong
    // 日    期：2015-9-16
    // 返 回 值: 无
    // 参    数: str
    //***************************************************************************
    string md5Str(string str);
}
#endif
